package com.candy.dao;

import java.sql.*;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;

/**
 * 对jdbc常用操作进行封装
 * 共性提取，个性传参
 */
public class DBDriver {
    /**
     * 获取数据库的链接对象
     * @return
     */
    public static Connection getConn() {
        Connection conn =null;
        try {
//         （0）下载jdbc驱动包；将驱动包导入项目。
//        注意：mysql8和mysql5的驱动包版本不通用。
//        项目使用maven构建，直接通过pom指定依赖即可
//        （1）注册或实例化jdbc的驱动类(使用反射的方式进行注册驱动)
            Class.forName("com.mysql.cj.jdbc.Driver");
//        （2）获取数据库连接对象Connection
//            获取数据库的链接对象需要用到三个参数 ，
//            分别是数据库连接串（注意mysql8与mysql5的连接串不同）
//            jdbc:mysql 表示jdbc链接mysql数据库
//            localhost表示要链接的数据库ip 此处的localhost表示本机登记与127.0.0.1
//            3306表示mysql的端口
//            database_name表示要链接的数据库的名字(更换成你要链接的数据库的名字)
            String url = "jdbc:mysql://localhost:3306/ld_mysql0317? characterEncoding=utf8 & useSSL=false & serverTimezone=UTC & rewriteBatchedStatements=true";
//            数据库的用户名
            String username = "root";
//            数据库的密码
            String password = "123456";
            conn = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return conn;
    }

    /**
     * 进行新增、删除、修改操作
     * @param sql 要执行的sql语句
     * @return 影响行数
     */
    public static int update(String sql) {
        int count=0;
//        类集成了AutoCloseable，可以直接放在try后面的括号中，
//        在资源调用完毕后，会自动调用close方法，而不需要手动调用了
        try(Connection conn=getConn();
//        （3）获取数据库操作对象Statement（执行增删改查）
            Statement ment=conn.createStatement();) {

//        （4）执行SQL语句，获取数据操作结果或者结果集对象ResultSet
            count=ment.executeUpdate(sql);
            System.out.println(count);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return count;
    }

    /**
     * 查询操作
     * @param sql 查询的sql语句
     * @return 数据最终保存的list
     */
    public static LinkedList<LinkedHashMap<String,Object>> query4ListMap(String sql) {
        LinkedList<LinkedHashMap<String,Object>> datalist=null;
        try(
                Connection conn=getConn();
//        （3）获取数据库操作对象Statement（执行增删改查）
                Statement ment=conn.createStatement();
//        （4）执行SQL语句，获取数据操作结果或者结果集对象ResultSet
                ResultSet rs=ment.executeQuery(sql);
                ) {
//        （5）解析结果集对象ResultSet，进行相关的业务处理；
//            准备一个容器，对数据进行存储
           datalist=new LinkedList<>();
//            准备一个map集合，存放每一行的数据结果
            LinkedHashMap<String,Object> eachRow=null;
//          获取元数据（包括表的字段，有多少个列等等）
            ResultSetMetaData rm=rs.getMetaData();
//        获取resultSet的列
            int count=rm.getColumnCount();
//            next()表示数据读取，若当前行有数据，则返回true，反之返回false
            while (rs.next()){
//                将每一行的数据存放在map集合中
                eachRow=new LinkedHashMap<>();
//                有多少列循环多少次
                for (int i = 1; i <=count ; i++) {
//                    将数据添加进map中
//                    rm.getColumnLabel(i)获取该列的列名
//                    rs.getObject(rm.getColumnLabel(i)) 通过列名获取该列对应的值
                    eachRow.put(rm.getColumnLabel(i),rs.getObject(rm.getColumnLabel(i)));
                }
//                将map添加到list中
                datalist.add(eachRow);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return datalist;
    }

}